{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import scipy.io as scio\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import random\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "outputs": [],
   "source": [
    "def feedforward(w,a,x):\n",
    "    # sigmoid 激活函数\n",
    "    f = lambda s: 1 / (1 + np.exp(-s))\n",
    "\n",
    "    w = np.array(w)\n",
    "    temp = np.array(np.concatenate((a,x),axis=0))\n",
    "    z_next = np.dot(w , temp)\n",
    "\n",
    "    return f(z_next), z_next"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "outputs": [],
   "source": [
    "def feedforward(w,a,x):\n",
    "    # sigmoid 激活函数\n",
    "    f = lambda s: 1 / (1 + np.exp(-s))\n",
    "\n",
    "    w = np.array(w)\n",
    "    temp = np.array(np.concatenate((a,x),axis=0))\n",
    "    z_next = np.dot(w , temp)\n",
    "\n",
    "    return f(z_next), z_next"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "outputs": [],
   "source": [
    "def backprop(w,z,delta_next):\n",
    "\n",
    "    # sigmoid 激活函数\n",
    "    f = lambda s: np.array(1 / (1 + np.exp(-s)))\n",
    "\n",
    "    # sigmoid 激活函数的导数\n",
    "    df = lambda s: f(s) * (1 - f(s))\n",
    "\n",
    "    delta = df(z) * np.dot(w.T,delta_next)\n",
    "\n",
    "    return delta"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "outputs": [],
   "source": [
    "DataSet = scio.loadmat('yaleB_face_dataset.mat')\n",
    "unlabeledData = DataSet['unlabeled_data']\n",
    "\n",
    "dataset_size = 80 # 我们所准备无标签的人脸图片数据数量\n",
    "unlabeled_data = np.zeros(unlabeledData.shape)\n",
    "\n",
    "# 利用 z-score 归一化方法归一数据\n",
    "for i in range(dataset_size):\n",
    "    tmp = unlabeledData[:,i] / 255.\n",
    "    unlabeled_data[:,i] = (tmp - np.mean(tmp)) / np.std(tmp)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "outputs": [],
   "source": [
    "alpha = 0.5 # 学习步长\n",
    "max_epoch = 300 # 自编码器训练总次数\n",
    "mini_batch = 10 # 最小批训练时，每次使用 10 个样本同时进行训练\n",
    "height = 48  # 人脸数据图片的高度\n",
    "width = 42 # 人脸数据图片的宽度\n",
    "imgSize = height * width\n",
    "\n",
    "# 神经网络结构\n",
    "hidden_node = 60 # 网络隐藏层节点数目\n",
    "hidden_layer = 2\n",
    "layer_struc = [[imgSize, 1],\n",
    "               [0, hidden_node],\n",
    "               [0, imgSize]]\n",
    "layer_num = 3 # 网络层次数目\n",
    "\n",
    "# 初始化无监督网络的权值\n",
    "w = []\n",
    "for l in range(layer_num-1):\n",
    "    w.append(np.random.randn(layer_struc[l+1][1],sum(layer_struc[l])))\n",
    "\n",
    "# 定义神经网络的外部节点数目\n",
    "X = []\n",
    "X.append(np.array(unlabeled_data[:,:]))\n",
    "X.append(np.zeros((0,dataset_size)))\n",
    "X.append(np.zeros((0,dataset_size)))\n",
    "\n",
    "# 初始化在网络训练过程中，进行误差反向传播所需的 δ\n",
    "delta = []\n",
    "for l in range(layer_num):\n",
    "    delta.append([])"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp/ipykernel_17088/1144080573.py:8: MatplotlibDeprecationWarning: Passing non-integers as three-element position specification is deprecated since 3.3 and will be removed two minor releases later.\n",
      "  ax = plt.subplot(nRow, nColumn, iImg+1)\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 4 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 定义结果展示参数\n",
    "nRow = max_epoch / 100 + 1\n",
    "nColumn = 4\n",
    "eachFaceNum = 20 # 对于每个人都有 20 张未标记图像数据\n",
    "\n",
    "# 在第一行中展示原始图像\n",
    "for iImg in range(nColumn):\n",
    "    ax = plt.subplot(nRow, nColumn, iImg+1)\n",
    "    plt.imshow(unlabeledData[:,eachFaceNum * iImg + 1].reshape((width,height)).T, cmap= plt.cm.gray)\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Autoencoder training start..\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp/ipykernel_17088/2250432331.py:3: RuntimeWarning: overflow encountered in exp\n",
      "  f = lambda s: 1 / (1 + np.exp(-s))\n",
      "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp/ipykernel_17088/1270457221.py:4: RuntimeWarning: overflow encountered in exp\n",
      "  f = lambda s: np.array(1 / (1 + np.exp(-s)))\n",
      "C:\\Users\\ADMINI~1\\AppData\\Local\\Temp/ipykernel_17088/3588311253.py:47: MatplotlibDeprecationWarning: Passing non-integers as three-element position specification is deprecated since 3.3 and will be removed two minor releases later.\n",
      "  ax = plt.subplot(nRow,nColumn, iImg + nColumn * (iter+1)/100 + 1)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Learning epoch: 100 / 300\n",
      "Learning epoch: 200 / 300\n",
      "Learning epoch: 300 / 300\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 12 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "#无监督训练\n",
    "count = 0 # 记录训练次数\n",
    "print('Autoencoder training start..')\n",
    "for iter in range(max_epoch):\n",
    "\n",
    "    # 定义随机洗牌下标\n",
    "    ind = list(range(dataset_size))\n",
    "    random.shuffle(ind)\n",
    "\n",
    "    a = []\n",
    "    z = []\n",
    "    z.append([])\n",
    "    for i in range(int(np.ceil(dataset_size / mini_batch))):\n",
    "        a.append(np.zeros((layer_struc[0][1], mini_batch)))\n",
    "        x = []\n",
    "        for l in range(layer_num):\n",
    "            x.append( X[l][:,ind[i*mini_batch : min((i+1)*mini_batch, dataset_size)]])\n",
    "\n",
    "        y = unlabeled_data[:,ind[i*mini_batch:min((i+1)*mini_batch,dataset_size)]]\n",
    "        for l in range(layer_num-1):\n",
    "            a.append([])\n",
    "            z.append([])\n",
    "            a[l+1],z[l+1] = feedforward(w[l],a[l],x[l])\n",
    "\n",
    "        delta[layer_num-1] = np.array(a[layer_num-1] - y) * np.array(a[layer_num-1])\n",
    "        delta[layer_num-1] = delta[layer_num-1] * np.array(1-a[layer_num-1])\n",
    "\n",
    "        for l in range(layer_num-2, 0, -1):\n",
    "            delta[l] = backprop(w[l],z[l],delta[l+1])\n",
    "\n",
    "        for l in range(layer_num-1):\n",
    "            dw = np.dot(delta[l+1], np.concatenate((a[l],x[l]),axis=0).T) / mini_batch\n",
    "            w[l] = w[l] - alpha * dw\n",
    "\n",
    "    count = count + 1\n",
    "\n",
    "    # 每训练 100 次展示一次自编码器目前对原始图像的输出结果\n",
    "    if np.mod(iter+1,100) == 0 :\n",
    "        b = []\n",
    "        b.append(np.zeros((layer_struc[0][1],dataset_size)))\n",
    "\n",
    "        for l in range(layer_num-1):\n",
    "            tempA, tempZ = feedforward(w[l], b[l], X[l])\n",
    "            b.append(tempA)\n",
    "\n",
    "        for iImg in range(nColumn):\n",
    "            ax = plt.subplot(nRow,nColumn, iImg + nColumn * (iter+1)/100 + 1)\n",
    "            tmp = b[layer_num-1][:,eachFaceNum * iImg + 1]\n",
    "            dis_result = ((tmp * np.std(tmp)) + np.mean(tmp)).reshape(width,height).T\n",
    "            plt.imshow(dis_result,cmap= plt.cm.gray)\n",
    "            ax.get_xaxis().set_visible(False)\n",
    "            ax.get_yaxis().set_visible(False)\n",
    "\n",
    "        print('Learning epoch:', count, '/', max_epoch)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 8 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig2 = plt.figure(2)\n",
    "\n",
    "# 获得编码结果\n",
    "code_result, tempZ = feedforward(w[0], b[0], X[0])\n",
    "\n",
    "# 展示原始数据图\n",
    "for iImg in range(nColumn):\n",
    "    ax = plt.subplot(2, nColumn, iImg+1)\n",
    "    plt.imshow(unlabeled_data[:,eachFaceNum * iImg + 1].reshape((width,height)).T, cmap= plt.cm.gray)\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)\n",
    "\n",
    "# 展示对应的编码结果\n",
    "for iImg in range(nColumn):\n",
    "    ax = plt.subplot(2,nColumn,iImg+nColumn+1)\n",
    "    plt.imshow(code_result[:,eachFaceNum * iImg + 1].reshape((hidden_node,1)), cmap=plt.cm.gray)\n",
    "    ax.get_xaxis().set_visible(False)\n",
    "    ax.get_yaxis().set_visible(False)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}